package com.eugeneMa.common;

import com.eugeneMa.entity.EnumBase;
import com.eugeneMa.service.inter.EnumBaseService;
import com.eugeneMa.util.AuthUtil;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 配置类，包含数据库可自定义的配置：例如枚举类等。
 * 加载到内存，以便使用更方便，枚举类可用来转义前端显示的内容
 *
 * @author Eugenema
 * @date 2022/1/18 23:14
 */
@Component
public class Config implements ApplicationListener<ContextRefreshedEvent> {
    /** 枚举值Map<枚举类, Map<枚举键, 枚举值>> */
    public static Map<String, Map<Integer, String>> enumMap = new HashMap<>();
    /** 配置文件参数 */
    public static Map<String, String> properties = new HashMap<>();


    /** 验证码取值范围 */
    @Value("${codeRange}")
    private String codeRange;
    /** JWT签名 */
    @Value("${signature}")
    private String signature;
    /** 系统版本 */
    @Value("${systemVersion}")
    private String systemVersion;


    /** 日志 */
    private Logger logger = Logger.getLogger(Config.class);

    /** 枚举类业务层 */
    @Autowired
    private EnumBaseService enumBaseService;

    /**
     * 系统启动后执行一次
     *
     * @author Eugenema
     * @date 2022/1/18 22:14
     *
     **/
    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        //保证只执行一次
        if(contextRefreshedEvent.getApplicationContext().getParent() == null){
            logger.info("<<< 学习铃系统初始化开始 >>>");

            try {
                //获取所有枚举值，赋值到Config类中的静态变量enumMap
                logger.info("=== 枚举值开始初始化 ===");
                List<EnumBase> enumBases = enumBaseService.getEnumBases();
                Map<Integer, String> enumClassMap;
                //将查询到的数据，根据枚举类分组
                for (EnumBase enumBase : enumBases) {
                    String enumClass = enumBase.getEnumClass();
                    enumClassMap = Config.enumMap.get(enumClass);
                    if (enumClassMap == null) {
                        enumClassMap = new HashMap<>(1);
                    }
                    enumClassMap.put(enumBase.getEnumKey(), enumBase.getEnumValue());
                    Config.enumMap.put(enumClass, enumClassMap);
                }
                logger.info("=== 枚举值结束初始化 ===");

                //获取所有配置文件参数，赋值到Config类中的静态变量properties
                logger.info("=== 配置文件开始初始化 ===");
                properties.put("codeRange", codeRange);
                properties.put("signature", signature);
                properties.put("systemVersion", systemVersion);
                logger.info("=== 配置文件结束初始化 ===");
            } catch (Exception e) {
                e.printStackTrace();
                logger.error("系统初始化失败：", e);
            }

            logger.info("<<<学习铃系统初始化结束>>>");
        }
    }
}
